package com.niiuzu.client.util.widget;

import com.google.gwt.core.client.GWT;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.Widget;

/**
 * {@link Widget} destinée à afficher le détail d'une erreur technique dans une
 * popup.
 */
public class ErrorMessageWidget extends Composite {

	/**
	 * Interface {@link UiBinder} adaptée à la widget {@link ErrorMessageWidget}
	 * .
	 */
	interface SuitedUiBinder extends UiBinder<Widget, ErrorMessageWidget> {

	}

	private static final String STACKTRACE_EOL = "\r\n";

	@UiField
	TextArea errorDetail;
	@UiField
	Button closeButton;

	/**
	 * Construit une nouvelle instance de {@link ErrorMessageWidget}.
	 */
	public ErrorMessageWidget() {
		SuitedUiBinder uiBinder = GWT.create(SuitedUiBinder.class);
		initWidget(uiBinder.createAndBindUi(this));
	}

	/**
	 * Définit l'erreur qui sera affichée dans la {@link Widget}.
	 */
	public void setError(Throwable throwable) {

		StringBuffer errorDetailBuffer = new StringBuffer();
		errorDetailBuffer.append(throwable.getMessage());
		errorDetailBuffer.append(STACKTRACE_EOL);
		for (StackTraceElement stackTraceElt : throwable.getStackTrace()) {
			errorDetailBuffer.append(stackTraceElt.toString());
			errorDetailBuffer.append(STACKTRACE_EOL);
		}

		errorDetail.setText(errorDetailBuffer.toString());
	}

	/**
	 * Bouton destiné à fermer la popup qui contiendra cette {@link Widget}.
	 */
	public Button getCloseButton() {
		return closeButton;
	}
}
